import {connect } from 'react-redux'
let mapState = function(myComponent,stateData){
// myComponent代表需要绑定的组件，stateData数组类型代表需要绑定的状态数据的名称
    const mapStateToProps = (state)=>{
        let states ={};
        for (let index in stateData) {
            states[stateData[index]] = state[stateData[index]]
            
        }
        return states;
    }
    // 将数据绑定给指定的组件，并且将绑定的结果返回给外界
    return connect(mapStateToProps)(myComponent);
}

// 为了组件添加修改store中的state操作
let mapDispatch = function(myComponent,actions){
    let mapDispatchProps = function(dispatch){
        // 当前对象将要保存映射方法，最终传递给当前组件的props属性
        let dispatchs = {};
        // 循环注册方法（方法给当前组件）
        for(let index in actions){
            // 取出当前要注册的函数配置
            let action = actions[index];
            // 判断是否有参数需要传递到store内部
            if(action.params){
            // 向对象中添加函数
                dispatchs[action.type] = (params)=>{
                    // 当被触发时，向store中传递action，要求state数据改变
                    dispatch({
                        ...action,
                        params
                    })
                }
            }else{
                dispatchs[action.type] = ()=>{
                    // 当被触发时，向store中传递action，要求state数据改变
                    dispatch({type:action.type})
                }
            }
        };
        return dispatchs;
    }
// mapDispatchProps会在内部生成一个对象，对象是一个键值对，键是方法名，键对应的的值是函数体，此对象会被connect传递到myComponent变量代表的组件的props中，所以说我们在myComponent的组件中使用：this.props.键名 
// connect函数把mapDispatchProps执行的结果，传递给myComponent变量的组件的props对象中。一句话：把dispatch对象和props对象合并
    return connect(null,mapDispatchProps)(myComponent)
}

export  {mapState,mapDispatch}